{
    //使用修饰器来限制某一个属性是只读的

    /**
     *      
     * @param {Obj} target 修改的类本身
     * @param {str} name   修改的属性名称 
     * @param {obj} descriptor 该属性的描述对象(就是那个内部属性)
     */
    // let readonly=function (target,name,descriptor) {
    //     descriptor.writable=false;
    //     return descriptor
    // }

    // //因为修饰器是修饰类,所以说,我们要有一个类
    // class Test{
    //     @readonly
    //     time(){
    //         return '2017-03-11';
    //     }

    //     lala(){
    //         return 'haha';
    //     }
    // }
    // let test=new Test();

    // console.log(test.lala());
    // //这个时候,我们去修改time的属性
    // test.lala=function () {
    //     console.log('我是修改过后的!!');
    // };
    // console.log(test.lala());

}

{
    //新的修饰器,这次我们实验在类外面
    //这里的target参数就是类本身了
    // let typename=function (target,name,descriptor) {
    //     //这个方法就是在类(构造函数)上增加一个静态的属性
    //     target.myname='hello';
    // }

    // @typename
    // class Test{

    // }
    // //我感觉这个本质上就是一个函数
    // //只不过这个JS给你封装好了,使用@操作符,把后面对象的具体信息给你传到参数当中
    // //这样你写的话,就是比较方便了
    // console.log(Test.myname);

}

{
    //关于使用decorators
    //按照原来的实现方法,我们要是埋点的话
    //就是在各个方法当中添加console.log()这样来输出
    //这样并不美观

    let log=(type)=>{
        return function(target,name,descriptor){
            //这里就是原始函数体引用(记住存储的是引用类型的)
            //现在这个src_method和原来的存储的是相同的引用
            let src_method=descriptor.value;
            //对函数体重新赋值
            //REST...将参数打包成数组
            descriptor.value=(...arg)=>{
                //这里将this进行绑定并执行(相当于执行原来的函数不变)
                //apply第二个参数是一个数组(里面存储了传入的参数,刚好和REST...不谋而合)
                src_method.apply(target,arg);
                //这里才是我们都通用的代码
                console.log(`log ${type}`);
            }
        }
    };

    //我们写一个类当作例子
    class AD{
        //这里我们开始埋点
        @log('show')
        show(){
            console.log('ad is show')
        }

        @log('click')
        click(){
            console.log('ad is click')
        }
    }

    let ad=new AD();
    ad.show();
    ad.click();

}




























































